#pragma once

#include <QString>

#include "doc_define.h"

class Row;

////*
// 
// 重要说明：
// 
// -----------------------------------------------------------
// 空行对象
// Line对象的特殊情况，没有内容且没有换行符，
// 即，Line::charCnt返回0，且，lineEnd返回LineEnd::NO
// 
// -----------------------------------------------------------
// 文档对象设计：
// 为了逻辑清晰、统一，对文档对象的组织做如下规定
// 必须保证文档至少有一行，即lineCnt的返回值大于0
// 
// 分以下几种情况：
// 1：文档没有内容：
//     此时Doc中有1个空行对象，
//     因为从用户的角度看，文档没有内容时，应该在第一行书写，所以逻辑上认为有了一个空行
// 2：文档有内容，不以换行符结尾：
//     此时Doc中最后一个行对象为文档真实的最后一行，
//     内容为最后一行的内容，
//     换行符为LineEnd::NO(表示没有换行符)
//     因为从用户的角度看，如果不以换行符结尾，则这一行还没有结束，也不能另起一行
// 3：文档有内容，以换行结尾：
//     此时Doc中最后会额外添加一个空行对象，
//     因为从用户的角度来看，只要有了换行符，就应该另起一行书写了
// 
// -----------------------------------------------------------
// 
///*/


// 文档，提供对不同类型、不同大小的文档的抽象
// 提供和底层真实数据的交互
class Doc
{
public:
    virtual ~Doc() {}

    virtual RowN rowCnt() const = 0;

    virtual const Row &rowAt(RowN line) const = 0;
};
